﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using log4net;
using log4net.Config;
using CSI.BABELE.WebServices.BLayer;
using System.Web.Services.Protocols;
using System.Xml;
using System.IO;
using System.Runtime.Remoting;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using System.Reflection;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Soap;
using System.Threading;
using System.Globalization;
using System.IdentityModel.Tokens;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.Security.Principal;
using System.Collections.Specialized;

/// <summary>
/// Integrazione tra il sistema BABELE e i sistemi Dipartimentali
/// </summary>
namespace CSI.BABELE.WebServices
{
    [WebService(Namespace = "http://CheckService.central.services.auraws.aura.csi.it")]
    //[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [SoapDocumentService(RoutingStyle = SoapServiceRoutingStyle.RequestElement)]
    public class BabeleService : System.Web.Services.WebService
    {
        
        private static log4net.ILog log;
        //public AuthSoapHd authenticationProxy;

        public BabeleService()
        {
        }

        [WebMethod(Description = "Verifica la disponibilità del servizio.", CacheDuration = 0)]
        [SoapDocumentMethod(Action = "http://CheckService.central.services.auraws.aura.csi.it/AULA.WS.AulaWS.CaricaXml")]
        //[SoapHeader("authenticationProxy")]
        public void CaricaXml()
        {
            DAOServices dao = new DAOServices();
            dao.ScorriEventi();
        }

        [WebMethod(Description = "Verifica la disponibilità del servizio.", CacheDuration = 0)]
        [SoapDocumentMethod(Action = "http://CheckService.central.services.auraws.aura.csi.it/AULA.WS.AulaWS.IsAlive")]
        //[SoapHeader("authenticationProxy")]
        public bool IsAlive()
        {
            DAOServices dao = new DAOServices();

            return dao.IsAlive();
        }


        [WebMethod(Description = "Verifica la disponibilità del servizio.", CacheDuration = 0)]
        [SoapDocumentMethod(Action = "http://CheckService.central.services.auraws.aura.csi.it/AULA.WS.AulaWS.TestGenerico")]
        //[SoapHeader("authenticationProxy")]
        public void TestGenerico()
        {

            string risultato = DAOServices.xmlMittente();

        }

        //public SoapUnknownHeader[] unknownHeaders;

        [WebMethod(Description = "Inoltra una nuova richiesta al Dipartimentale.", CacheDuration = 0)]
        //[SoapHeader("authenticationProxy")]
        [SoapDocumentMethod(Action = "http://CheckService.central.services.auraws.aura.csi.it/AULA.WS.AulaWS.InvioRichiesta")]
        public messaggioEtichette InvioRichiesta(int idRichiesta, string type)
        {
            #region Local Variables

            bool inviato = false;
            DAOServices _daoSrv = new DAOServices();
            messaggioEtichette invioRichiestaResponse = new messaggioEtichette();

            #endregion

            #region LOG

            LOGHelp.LoadLog4NeFromCongif();

            //Leggo la sezione di appender per il file di log specifico per il servizio
            log = log4net.LogManager.GetLogger("Servizio");
            log.Debug("___________________________________________________________");
            log.Debug("Il servizio è stato invocato correttamente #InvioRichiesta#");
            log.Debug("___________________________________________________________");

            #endregion
            
            try
            {
                #region Authentication

                /*
                 * 
                 * Creato utente servizio su IIS
                 * 
                 */

                //if (null != authenticationProxy)
                //{
                //    //Al primo accesso inserisco la nuova coppia di chiavi sulla base dati
                //    DAOServices.SaveUsernamePassword(authenticationProxy.strUserName, authenticationProxy.strPassword);

                //    bool isAuth = DAOServices.IsAuthenticated(authenticationProxy.strUserName, authenticationProxy.strPassword);

                //    if(!isAuth)
                //        throw new Exception("Accesso negato, impossibile accedere per l'utente: " + authenticationProxy.strUserName);
                //}
                //else
                //    throw new Exception("Accesso negato, necessario specificare credenziali di accesso.");

                #endregion

                #region Get XML from DB

                string xml = DAOServices.messaggioSIO(idRichiesta, type);

                #endregion

                #region Generazione SOAP Message

                string envelope = X509SecurityService.EnevelopeDefinition(xml);

                XmlDocument xmlSoapRequest = new XmlDocument();
                xmlSoapRequest.LoadXml(envelope);

                #endregion

                #region Deserialize

                object obj = DAOServices.DeserializeFromXmlString(xml, typeof(messaggioSIO));
                messaggioSIO invioRichiesta = (messaggioSIO)obj;

                #endregion

                #region Valorizzo il GUID per la richiesta corrente

                _daoSrv.setGUID(invioRichiesta.headerSIO.guid);

                #endregion

                #region Trace su SOAP_Integrazione_log

                DAOServices.SOAP_Integrazione_log(envelope);

                #endregion

                #region SCHEMA VALIDATION + Trace su SOAP_Integrazione_ErrorDetail

                bool isValid = DAOServices.Validate(invioRichiesta, @"Schema\InvioRichesta.xsd");

                #endregion

                #region Call WSO2 WebServices

                if (isValid)
                {

                    inviato = true;

                    ////TODO: inviare il messaggio a WSO2
                    //WebResponse rsp;
                    //XmlWriter xmlWriter;
                    //XmlDocument xmldoc = new XmlDocument();
                    //xmldoc.LoadXml(xml);
                    //HttpWebRequest req =
                    //    (HttpWebRequest)WebRequest.Create(
                    //    "http://10.102.41.211/babele_WS/BABELESERVICE.ASMX");

                    //req.Headers.Add(String.Format("SOAPAction: \"{0}\"",
                    //                "http://tempuri.org/IsAlive"));

                    //req.ContentType = "text/xml;charset=\"utf-8\"";
                    //req.Method = "POST";

                    //xmlWriter = new XmlTextWriter(req.GetRequestStream(),
                    //                              System.Text.Encoding.UTF8);

                    //xmldoc.WriteTo(xmlWriter);
                    //xmlWriter.Close();

                    //rsp = req.GetResponse();
                    //StreamReader srd = new StreamReader(rsp.GetResponseStream());

                    //string get = srd.ReadToEnd().ToString();
                    //srd.Close();
                }


                #endregion

                #region Aggiornamento stato Richiesta

                //TODO

                #endregion
            }
            catch (Exception ex)
            {
                #region ERROR MANAGER

                log.Debug("___________________________________________________________________________________________");
                log.Debug("Si è verificato un errore durante la chiamata al servizio");
                log.Debug("Il WebMethod #InvioRichiesta# ha restituito il seguente errore:");
                log.Debug(ex.Message);
                log.Debug("#IdRichiesta# " + idRichiesta.ToString());
                log.Debug("___________________________________________________________________________________________");

                #endregion
            }

            return invioRichiestaResponse;
        }

        [WebMethod]
        public void mail()
        {
            SimpleAsynchronousMail.Main();
        }
    }
}